package gaej.example.contact.client;

import java.util.List;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.HTMLTable.Cell;

public class UitvoeringGUI {
    /* Constants. */
    private static final String LISTING_ROOT_PANEL = "guiListing";
    private static final String FORM_ROOT_PANEL = "guiForm";
    private static final String STATUS_ROOT_PANEL = "guiStatus";
    private static final String TOOL_BAR_ROOT_PANEL = "guiToolBar";
    private static final int EDIT_LINK = 3;
    private static final int REMOVE_LINK = 4;

    /* GUI Widgets */
    protected Button addButton;
    protected Button updateButton;
    protected Button addNewButton;
    protected ListBox dirigentNrField;
    protected ListBox muziekstukNrField;
    protected TextBox naamField;
    protected TextBox landField;
    protected TextBox datumField;
    protected TextBox schouwburgField;
    protected Label status;
    protected Grid listGrid;
    protected Grid formGrid;
    
    /* Data model */
    private List<Dirigent> dirigenten;
    private List<Muziekstuk> muziekstukken;
    
    private List<Uitvoering> uitvoeringen;
    private Uitvoering currentUitvoering;
    protected UitvoeringDelegate uitvoeringService;
        
    public void init() {
        addButton = new Button("Add uitvoering");
        addNewButton = new Button("Add new uitvoering");
        updateButton = new Button("Update uitvoering");
        dirigentNrField = new ListBox();
        muziekstukNrField = new ListBox();
        naamField = new TextBox();
        landField = new TextBox();
        datumField = new TextBox();
        schouwburgField = new TextBox();
        status = new Label();
        listGrid = new Grid(2,6);

        buildForm();
        placeWidgets();
    }
    
    private void buildForm() {
        formGrid = new Grid(5,3);
        formGrid.setVisible(false);

        formGrid.setWidget(0, 0, new Label("Dirigent"));
        formGrid.setWidget(0, 1, dirigentNrField);        
        
        formGrid.setWidget(1, 0, new Label("Muziekstuk"));
        formGrid.setWidget(1, 1, muziekstukNrField);
        
        formGrid.setWidget(2, 0, new Label("Datum"));
        formGrid.setWidget(2, 1, datumField);

        formGrid.setWidget(3, 0, new Label("Schouwburg"));
        formGrid.setWidget(3, 1, schouwburgField);
        
        formGrid.setWidget(4, 0, updateButton);
        formGrid.setWidget(4, 1, addButton);
        
    }

    private void placeWidgets() {
        RootPanel.get(LISTING_ROOT_PANEL).add(listGrid);
        RootPanel.get(FORM_ROOT_PANEL).add(formGrid);
        RootPanel.get(STATUS_ROOT_PANEL).add(status);
        RootPanel.get(TOOL_BAR_ROOT_PANEL).add(addNewButton);
    }

    public void hideGui() {
    	formGrid.setVisible(false);
    	listGrid.setVisible(false);
    	status.setVisible(false);
    	addNewButton.setVisible(false);
    }

    
    private void loadForm(Uitvoering uitvoering) {
        this.formGrid.setVisible(true);
        currentUitvoering = uitvoering;
        
        this.dirigentNrField.clear();
        int index = 0;
        int selected = 0;
        for (Dirigent dirigent : dirigenten) {
        	this.dirigentNrField.addItem(dirigent.getPersoon().getNaam());
        	if (uitvoering.getDirigentNr().longValue() == 
        		dirigent.getDirigentNr().longValue()) {
        		selected = index;
        		//this.componistNrField.setSelectedIndex(index);
        	}
        	index++;
        }        
        this.dirigentNrField.setSelectedIndex(selected);
        
        this.muziekstukNrField.clear();
        index = 0;
        selected = 0;
        for (Muziekstuk muziekstuk : muziekstukken) {
        	this.muziekstukNrField.addItem(muziekstuk.getTitel());
        	if (uitvoering.getMuziekstukNr().longValue() == 
        		muziekstuk.getMuziekstukNr().longValue()) {
        		selected = index;
        		//this.componistNrField.setSelectedIndex(index);
        	}
        	index++;
        }        
        this.muziekstukNrField.setSelectedIndex(selected);
        
        this.datumField.setText(uitvoering.getDatum());
        this.schouwburgField.setText(uitvoering.getSchouwburg());
    }


    private void copyFieldDateToUitvoering() {
    	
    	int selected = this.dirigentNrField.getSelectedIndex();

    	Long dirigentNr = 0L;
        if (dirigenten.size() > selected) {
        	dirigentNr = dirigenten.get(selected).getDirigentNr();
        }
        currentUitvoering.setDirigentNr(dirigentNr);

    	selected = this.muziekstukNrField.getSelectedIndex();

    	Long muziekstukNr = 0L;
        if (muziekstukken.size() > selected) {
        	muziekstukNr = muziekstukken.get(selected).getMuziekstukNr();
        }
        currentUitvoering.setMuziekstukNr(muziekstukNr);

        currentUitvoering.setDatum(datumField.getText());
        currentUitvoering.setSchouwburg(schouwburgField.getText());
    }

    public void gui_eventListGridClicked(Cell cellClicked) {
         int row = cellClicked.getRowIndex();
         int col = cellClicked.getCellIndex();
        
         Uitvoering uitvoering = this.uitvoeringen.get(row);
         this.status.setText("Naam was " + uitvoering.getDatum() + " clicked ");
        
         if (col==EDIT_LINK) {
             this.addNewButton.setVisible(false);
             this.updateButton.setVisible(true);
             this.addButton.setVisible(false);
             loadForm(uitvoering);
         } else if (col==REMOVE_LINK) {
        	 if (Window.confirm("Verwijderen uitvoering ?")) {
        		 this.uitvoeringService.removeUitvoering(uitvoering);
        	 }
         }
    }


    public void gui_eventAddButtonClicked() {
        addNewButton.setVisible(true);
        formGrid.setVisible(false);
        copyFieldDateToUitvoering();
        this.uitvoeringService.addUitvoering(currentUitvoering);
    }

    public void gui_eventUpdateButtonClicked() {
        addNewButton.setVisible(true);
        formGrid.setVisible(false);
        copyFieldDateToUitvoering();
        this.uitvoeringService.updateUitvoering(currentUitvoering);
    }

    public void gui_eventAddNewButtonClicked() {
        this.addNewButton.setVisible(false);
        this.updateButton.setVisible(false);
        this.addButton.setVisible(true);
        Uitvoering uitvoering = new Uitvoering();
        uitvoering.setDirigentNr(0L);
        uitvoering.setMuziekstukNr(0L);
        loadForm(uitvoering);
    }

    public void service_dirigentenListRetrievedFromService(List<Dirigent> result) {
    	this.dirigenten = result;	
    }
    
    public void service_muziekstukkenListRetrievedFromService(List<Muziekstuk> result) {
    	this.muziekstukken = result;	
    }

    public void service_eventListRetrievedFromService(List<Uitvoering> result) {
        status.setText("Retrieved uitvoering list");
        status.setVisible(true);

        //formGrid.setVisible(false);
    	listGrid.setVisible(true);
    	status.setVisible(true);
    	addNewButton.setVisible(true);
        
        this.uitvoeringen = result;
        this.listGrid.clear();
        this.listGrid.resizeRows(this.uitvoeringen.size());
        int row = 0;
        this.addNewButton.setVisible(true);
        
        for (Uitvoering uitvoering : result) {
            this.listGrid.setWidget(row, 1, new Label (uitvoering.getDatum()));
            this.listGrid.setWidget(row, 2, new Label (uitvoering.getSchouwburg()));
            this.listGrid.setWidget(row, EDIT_LINK, new Hyperlink("Edit", null));
            this.listGrid.setWidget(row, REMOVE_LINK, new Hyperlink("Remove", null));
            row ++;
        }
    }

    public void service_eventAddUitvoeringSuccessful() {
        status.setText("Uitvoering was successfully added");
        this.uitvoeringService.listUitvoeringen();
    }

    public void service_eventUpdateSuccessful() {
        status.setText("Uitvoering was successfully updated");
        this.uitvoeringService.listUitvoeringen();
    }
    public void service_eventRemoveUitvoeringSuccessful() {
        status.setText("Uitvoering was removed");
        this.uitvoeringService.listUitvoeringen();
    }

    public void service_eventUpdateUitvoeringFailed(Throwable caught) {
        status.setText("Update uitvoering failed");
    }

    public void service_eventAddUitvoeringFailed(Throwable caught) {
        status.setText("Unable to update uitvoering");
    }

    public void service_eventRemoveUitvoeringFailed(Throwable caught) {
        status.setText("Remove uitvoering failed");
    }

    public void service_eventListUitvoeringenFailed(Throwable caught) {
        status.setText("Unable to get uitvoering list");
        
    }

}
